package com.ms.service.module.account;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;
import org.json.simple.parser.ParseException;

public class JsonParser {
	private static final Log log = LogFactory.getLog(JsonParser.class);
	
	// json value container
	private JSONObject jsonObject;

	/**
	 * 將 web 傳回的 stream 轉成 json container
	 * 
	 * @param inputStream
	 *            從 web 傳回的 stream
	 */
	public JsonParser(InputStream inputStream) {
		try {
			BufferedReader streamReader = new BufferedReader(new InputStreamReader(inputStream, "UTF-8"));
			StringBuilder responseStrBuilder = new StringBuilder();

			String inputStr;
			while ((inputStr = streamReader.readLine()) != null)
				responseStrBuilder.append(inputStr);

			parse(responseStrBuilder.toString());
		} catch (UnsupportedEncodingException e) {
			if (log.isErrorEnabled()) {
				log.error("parse string fail.", e);
			}
		} catch (IOException e) {
			if (log.isErrorEnabled()) {
				log.error("parse string fail.", e);
			}
		}
	}
	
	public JsonParser(String inputString) {
		parse(inputString);
	}
	
	public void parse(String jsonString) {
		if (jsonString == null) {
			return;
		}
		
		if(jsonString.isEmpty()){
			return;
		}

		try {
			JSONParser jsonParser = new JSONParser();
			jsonObject = (JSONObject) jsonParser.parse(jsonString);
		} catch (ParseException e) {
			if (log.isErrorEnabled()) {
				log.error("parse string fail.", e);
			}
		}
	}

	/**
	 * 取得 json 容器中的數值
	 * 
	 * @param keyName
	 *            jason 數值的 key
	 * @return 指定 key 代表的數值
	 */
	public String getString(String keyName) {
		if (jsonObject == null) {
			return null;
		}

		return (String) jsonObject.get(keyName);
	}

	/**
	 * 取得 json 容器中的數值
	 * 
	 * @param keyName
	 *            jason 數值的 key
	 * @return 指定 key 代表的數值
	 */
	public Long getLong(String keyName) {
		if (jsonObject == null) {
			return null;
		}

		return (Long) jsonObject.get(keyName);
	}
	
	/**
	 * 取得 json 容器中的數值
	 * 
	 * @param keyName
	 *            jason 數值的 key
	 * @return 指定 key 代表的數值
	 */
	public boolean getBoolean(String keyName) {
		if (jsonObject == null) {
			return false;
		}

		return (boolean) jsonObject.get(keyName);
	}
}